home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / swagd_f.zip / DATETIME.SWG / 0001_ASMTIME.PAS.pas next >
Pascal/Delphi Source File  |  1993-05-28  |  5KB  |  219 lines

  1. I saw a thread going on here, about the subject.
  2.  
  3. I just happen to have programmed such a thing, for a certain program. It's not
  4. perfect, in the essence that It will produce good results only from 1970 to
  5. 2099, because I didn't feel like starting to investigate which are leap years
  6. and which are not. All the leap years between 1970 and 2099 ARE included,
  7. though.
  8.  
  9. ---------------------------------= cut here =---------------------------------
  10. { ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ }
  11.  
  12.   { This procedure returns a LongInt UNIX-like timestamp. TimeRec will be  }
  13.   { overwritten by the resulted UNSIGNED DWORD.                            }
  14.  
  15.   Procedure SecondSince1970(Year, Month, Day, Hour, Minute:Word; Var TimeRec);
  16.  
  17.   Var       T_Lo,
  18.             T_Hi       : Word;
  19.  
  20.   Begin
  21.     Asm
  22.  
  23.       Call @Table
  24.  
  25.   @Table:
  26.  
  27.       Pop Si
  28.       Add Si,6            { Point Si to data table }
  29.       Jmp @Compute
  30.  
  31.       { This table contains the number of days in all months UNTIL this one }
  32.  
  33.       dw  0               { Within January }
  34.       dw  31              { January }
  35.       dw  59              { February }
  36.       dw  90              { Mars }
  37.       dw  120             { April }
  38.       dw  151             { May }
  39.       dw  181             { June }
  40.       dw  212             { July }
  41.       dw  243             { August }
  42.       dw  273             { September }
  43.       dw  304             { October }
  44.       dw  334             { November }
  45.  
  46.       { This i a routine to multiply a DWORD by a WORD }
  47.       { Input: DX:AX word to multilpy, CX multiplier }
  48.  
  49.   @Calc:
  50.  
  51.       Push Si
  52.       Push Di
  53.  
  54.       Mov Di,Dx
  55.       Mov Si,Ax
  56.  
  57.       Dec Cx              { We already have it multiplied by 1 }
  58.  
  59.   @Addit:
  60.  
  61.       Add Ax,Si
  62.       Adc Dx,Di
  63.  
  64.       Loop @Addit
  65.  
  66.       Pop Di
  67.       Pop Si
  68.  
  69.       Ret
  70.  
  71.   @Compute:
  72.  
  73.       Xor Di,Di           { Variable for leap year }
  74.  
  75.       { Seconds of round years }
  76.  
  77.       Mov Bx,Year
  78.       Sub Bx,1970
  79.       Mov Ax,365*24       { Hours per year }
  80.       Mov Cx,60*60        { Seconds per hour }
  81.       Xor Dx,Dx
  82.  
  83.       Call @Calc          { Multiply dword response by CX }
  84.       Mov Cx,Bx
  85.       Call @Calc
  86.  
  87.       Push Ax
  88.       Push Dx
  89.  
  90.       { Seconds of leap years }
  91.  
  92.       Mov Ax,Year
  93.       Sub Ax,1972         { First leap year after 1972 }
  94.       Mov Bx,4
  95.       Xor Dx,Dx
  96.       Div Bx
  97.  
  98.       { DX now holds number of days to add becaues of leap years. }
  99.       { If DX is 0, this is a leap year, and we need to take it into
  100. conideration }
  101.  
  102.       Mov Di,Dx          { If DI is 0, this is a leap year }
  103.  
  104.       Inc Ax             { We must count 1972 as well }
  105.       Xor Dx,Dx
  106.       Mov Bx,60*60
  107.       Mov Cx,24
  108.  
  109.       Mul Bx
  110.       Call @Calc
  111.  
  112.       Mov Cx,Dx
  113.       Mov Bx,Ax
  114.  
  115.       { Now add what we had before }
  116.  
  117.       Pop Dx
  118.       Pop Ax
  119.  
  120.       Add Ax,Bx
  121.       Adc Dx,Cx
  122.  
  123.       Push Ax
  124.       Push Dx
  125.  
  126.       { DX:AX holds the number of seconds since 1970 till the beginning of year
  127. }
  128.  
  129.       { Add days within this year }
  130.  
  131.       Mov Bx,Month
  132.       Dec Bx
  133.       Shl Bx,1
  134.       Add Bx,Si
  135.       Mov Bx,cs:[Bx]      { Lookup Table, sum of months EXCEPT this one }
  136.       Add Bx,Day          { Add days within this one }
  137.       Dec Bx              { Today hasn't ended yet }
  138.  
  139.       Mov Ax,60*60
  140.       Mov Cx,24
  141.       Xor Dx,Dx
  142.       Mul Bx
  143.       Call @Calc
  144.  
  145.       Mov Cx,Dx
  146.       Mov Bx,Ax
  147.  
  148.       { Now add what we had before - days until beginning of the year }
  149.  
  150.       Pop Dx
  151.       Pop Ax
  152.  
  153.       Add Ax,Bx
  154.       Adc Dx,Cx
  155.  
  156.       { DX:AX now holds the number of secondss since 1970 till beginning of
  157. day. }
  158.  
  159.       Push Ax
  160.       Push Dx
  161.  
  162.       { DX:AX holds the number of seconds until the beginning of this day }
  163.  
  164.       Mov Bx,Hour
  165.       Mov Ax,60*60   { Seconds per hour }
  166.       Xor Dx,Dx
  167.       Mul Bx
  168.  
  169.       Push Ax
  170.       Push Dx
  171.  
  172.       Mov Bx,Minute
  173.       Mov Ax,60      { Seconds per minute }
  174.       Xor Dx,Dx
  175.       Mul Bx
  176.  
  177.       Mov Cx,Dx
  178.       Mov Bx,Ax
  179.  
  180.       Pop Dx
  181.       Pop Ax
  182.  
  183.       Add Bx,Ax
  184.       Adc Cx,Dx
  185.  
  186.       { And add the seconds until beginning of year }
  187.  
  188.       Pop Dx
  189.       Pop Ax
  190.  
  191.       Add Ax,Bx
  192.       Adc Dx,Cx
  193.  
  194.       { DX:AX now holds number of second since 1970 }
  195.  
  196.       Mov T_Hi,Dx
  197.       Mov T_Lo,Ax
  198.  
  199.     End;
  200.  
  201.       Move(Mem[Seg(T_Lo):Ofs(T_Lo)],
  202.            Mem[Seg(TimeRec):Ofs(TimeRec)],2);
  203.  
  204.       Move(Mem[Seg(T_Hi):Ofs(T_Hi)],
  205.            Mem[Seg(TimeRec):Ofs(TimeRec)+2],2);
  206.  
  207.   End;
  208.  
  209. { ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ }
  210.  
  211. ---------------------------------= cut here =---------------------------------
  212.  
  213. Hope this helps.
  214.  
  215. Inbar Raz
  216.  
  217. --- FMail 0.94
  218.  * Origin: Castration takes balls. (2:403/100.42)
  219.